package xconsole

import (
	"strings"
	"time"

	"gitee.com/xiaoyutab/xgotool/optional/xlog"
	"gitee.com/xiaoyutab/xgotool/xerror"
	"gopkg.in/gomail.v2"
)

// 发送邮件的配置信息
type EmailConfig struct {
	MailHost       string   // 发件邮箱域名
	MailPort       int      // 发件邮箱端口
	MailUser       string   // 发件人
	MailName       string   // 发件人昵称
	MailPass       string   // 发件人密码
	MailAddress    string   // 收件人邮箱，多收件人使用 `,` 进行拼接
	MailCcAddress  string   // 抄送，多抄送人使用 `,` 进行拼接
	MailBccAddress string   // 暗送，多暗送人使用 `,` 进行拼接
	Subject        string   // 主题
	Body           string   // HTML内容
	Files          []string // 附件列表
}

// 发送邮件
//
//	conf	发送邮件配置
func SendEmail(conf *EmailConfig) error {
	defer xlog.Rtime(time.Now())
	if conf.MailUser == "" {
		return xerror.New("发件邮箱不允许为空")
	}
	if conf.MailHost == "" {
		return xerror.New("发件服务器地址不允许为空")
	}
	if conf.MailPort <= 0 {
		return xerror.New("发件服务器端口不允许为空")
	}
	if conf.Subject == "" {
		return xerror.New("发件主题不允许为空")
	}
	if conf.MailAddress != "" {
		return xerror.New("收件人不能为空")
	}
	m := gomail.NewMessage()
	m.SetAddressHeader("From", conf.MailUser, conf.MailName)
	// 收件人
	if strings.LastIndex(conf.MailAddress, ",") >= 0 {
		tos := strings.Split(conf.MailAddress, ",")
		m.SetHeader("To", tos...)
	} else {
		m.SetHeader("To", conf.MailAddress)
	}
	// 抄送人
	if strings.LastIndex(conf.MailCcAddress, ",") >= 0 {
		tos := strings.Split(conf.MailCcAddress, ",")
		m.SetHeader("Cc", tos...)
	} else {
		m.SetHeader("Cc", conf.MailCcAddress)
	}
	// 暗送人
	if strings.LastIndex(conf.MailBccAddress, ",") >= 0 {
		tos := strings.Split(conf.MailBccAddress, ",")
		m.SetHeader("Bcc", tos...)
	} else {
		m.SetHeader("Bcc", conf.MailBccAddress)
	}
	// 设置邮件主题
	m.SetHeader("Subject", conf.Subject)
	// 设置邮件正文
	m.SetBody("text/html", conf.Body)
	if len(conf.Files) > 0 {
		for _, v := range conf.Files {
			m.Attach(v)
		}
	}
	d := gomail.NewDialer(conf.MailHost, conf.MailPort, conf.MailUser, conf.MailPass)
	// 发送邮件
	return d.DialAndSend(m)
}
